package com.yinhe.service.jibeiSync.impl;

import cn.hutool.http.HttpUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yinhe.model.FireLimitPO;
import com.yinhe.model.JB_MT_PO;
import com.yinhe.model.SOCPO;
import com.yinhe.service.jibeiSync.IJiBeiMTParseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static com.google.common.io.Files.readLines;

/**
 * @author lilei
 * @create 2024-04-02-2024/4/2
 */
@Service
@Slf4j
public class IJiBeiMTParseServiceImpl implements IJiBeiMTParseService {

    @Value("${jibei.mt.filepath}")
    private String mtFilePath;

    //文件名前缀
    @Value("${jibei.mt.filePrefix}")
    private String filePrefix;

    //文件名后缀
    @Value("${jibei.mt.fileSuffix}")
    private String fileSuffix;

    @Value("${jibei.limit.filepath}")
    private String limitFilePath;

    //文件名前缀
    @Value("${jibei.limit.filePrefix}")
    private String limitFilePrefix;

    //文件名后缀
    @Value("${jibei.limit.fileSuffix}")
    private String limitFileSuffix;

    //判断取当前时间还是15分钟前的时间
    @Value("${jibei.limit.time}")
    private String limitTime;

    @Value("${jibei.soc.url}")
    private String socUrl;

    @Value("${jibei.soc.testPost}")
    private String testPost;

    @Value("${jibei.soc.realPost}")
    private String realPost;

    @Override
    public List<JB_MT_PO> parse(String day) throws IOException {
        //冀北统调电厂煤炭供耗存情况表报华北20240401.rb
        String fileName = filePrefix + day + fileSuffix;
        String filePath = mtFilePath + fileName;
        File file = new File(filePath);

        List<JB_MT_PO> jbMtPoList = new ArrayList<>();

        //<统调电厂煤炭供耗存情况表::冀北 date='2024-04-01'  >
        //@序号  电厂名称  电厂所在省区  电厂性质  电厂归属  供煤方式  订货方式  是否有机组接入1000kV电网  是否有机组接入750kV电网  是否有机组接入500kV电网  是否有机组接入330kV电网  是否有机组接入220kV电网  接入电压等级  统调装机容量  最大日耗煤量  当日发电量  燃料价格  当日收煤总量  当日耗煤总量  当日库存量  计算后库存  耗煤量基准值  去年同期库存  库存可用天数  正常储备线  低位发热量  缺煤停机台数  缺煤停机对应容量  厂外储煤  厂外代储煤	燃煤热值	购煤途径	承运铁路	公路	途径港口  情况说明  不满足最低库存标准原因  上报时间  上报状态
        //#1 张家口热电厂 河北 部份省外供煤 中国大唐集团公司 其他 其他 否 否 否 否 是 220 630 7000 4598 0 0 2061 136321 0 5446 0 25 0 0 0 0 0 0	3830	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#2 邓新房 河北 部份省外供煤 中国大唐集团公司 其他 其他 否 否 否 否 是 220 220 3114 0 0 0 0 47155 0 2295 32200 20.5 0 0 0 0 0 0	0	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#3 首钢自备电厂 河北 纯省外供煤 首钢京唐钢铁联合有限责任公司 其他 全国订货 否 否 否 否 否 110 600 7000 13994 0 8389 5110 130167 0 4794 0 27.1 0 0 0 0 0 0	5119	市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#4 润港 河北 部份省外供煤 华润电力投资有限公司 铁路直达 全国订货 否 否 否 否 是 220 600 5000 8965 0 3881 4262 111765 0 4085 0 27.3 0 0 0 0 0 0	4550	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#5 唐山热电厂 河北 部份省外供煤 中国大唐集团公司 铁路直达 全国订货 否 否 否 否 是 220 640 7500 3909 0 0 2287 148875 0 3934 0 37.8 0 0 0 0 100000 100000	3720	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#6 唐丰热电 河北 部份省外供煤 中国大唐集团公司 其他 其他 否 否 否 否 是 220 600 9000 3647 0 3391 1968 94612 0 3342 0 28.3 0 0 0 0 0 0	3668	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#7 秦皇岛发电厂 河北 部份省外供煤 国家能源集团国神集团有限公司 铁路直达 全国订货 否 否 否 否 是 220 1070 15919 9041 0 11093 5201 373648 0 7306 0 51.1 0 0 0 0 250000 250000	5044	长协煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#8 秦皇岛热电厂 河北 部份省外供煤 河北建投能源股份有限公司 铁路直达 全国订货 否 否 否 否 是 220 650 12075 4680 0 0 3276 139583 0 5400 0 25.8 0 0 0 0 0 0	3550	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#10 槐安热电厂 河北 纯省外供煤 国家能源集团 铁路直达 全国订货 否 否 否 否 是 220 660 7500 10276 0 5000 7302 83563 0 4088 103473 20.4 0 0 0 0 0 0	3797	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#11 下花园电厂 河北 部份省外供煤 中国大唐集团公司 其他 其他 否 否 否 否 是 220 210 3109 0 0 0 0 36501 0 2397 35000 15.2 0 0 0 0 0 0	3990	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#12 三河电厂 河北 纯省外供煤 国家能源集团 铁路直达 全国订货 否 否 否 否 是 220 1330 13000 5565 0 0 2743 167038 0 6872 72170 24.3 0 0 0 0 0 0	4600	长协煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#13 古郡电厂 河北 纯省外供煤 河北建投能源股份有限公司 其他 区域订货 否 否 否 否 是 220 660 8000 6323 0 4139 4442 176733 0 4790 0 36.8 0 0 0 0 100000 100000	3725.73	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#14 滦河电厂 河北 部份省外供煤 国家能源集团 铁路直达 全国订货 否 否 否 否 是 220 990 12500 8111 0 3704 6006 181386 0 8850 55000 20.4 0 0 0 0 0 0	3433	长协煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#15 陡河厂 河北 部份省外供煤 中国大唐集团公司 铁路直达 全国订货 否 否 否 否 是 220 420 15000 0 0 0 0 41859 0 2768 0 15.1 0 0 0 0 12624 12624	3962	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#16 润达电厂 河北 纯省外供煤 华润电力投资有限公司 铁路直达 全国订货 否 否 否 否 是 220 700 8000 10806 0 5639 5741 116265 0 5682 0 20.4 0 0 0 0 0 0	4315	长协煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#17 协鑫 河北 部份省外供煤 唐山开滦集团和协鑫集团 其他 区域订货 否 否 否 否 是 220 600 9280 7500 0 3416 5635 182394 0 4520 0 40.3 0 0 0 0 40000 40000	3.32	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#18 宏业电厂 河北 纯省外供煤 国家能源集团 铁路直达 全国订货 否 否 否 否 是 220 700 9500 5238 0 0 2094 102826 0 3179 0 32.3 0 0 0 0 0 0	4974	长协煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#19 板城电厂 河北 部分省外供煤 河北建投能源股份有限公司 其他 全国订货 否 否 否 否 是 220 700 9000 8291 0 2024 5469 120192 0 5838 0 20.5 0 0 0 0 32000 32000	3119	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#20 晨光电厂 河北 部分省外供煤 河北建投能源股份有限公司 其他 全国订货 否 否 否 否 是 220 700 5000 5656 0 3049 3526 153992 0 5465 0 28.1 0 0 0 0 40000 40000	4431	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#21 团山电厂 河北 部分省外供煤 中国大唐集团公司 其他 区域订货 否 否 否 否 是 220 700 8640 12080 0 672 7013 105089 0 5109 0 20.5 0 0 0 0 20000 20000	3880	长协煤,市场煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //#22 抚宁电厂 河北 纯省外供煤 京能集团 铁路直达 全国订货 否 否 否 否 是 220 700 9000 4309 0 0 2593 148115 0 4653 0 31.8 0 0 0 0 60000 60000	4145	长协煤	无	无	无 无 无 '2024-04-02 01:04:41' 已上报
        //</统调电厂煤炭供耗存情况表::冀北>

        //取电厂名称,库存可用天数,缺煤停机台数
        readLines(file, Charset.forName("GB2312")).forEach(line -> {
            if (line.startsWith("#")) {
                String[] split = line.split(" ");
                String name = split[1];
                String days = split[23];
                String stopNum = split[26];

                JB_MT_PO jbMtPo = new JB_MT_PO();
                jbMtPo.setPlantName(name);
                jbMtPo.setStockDays(days);
                jbMtPo.setStopNum(stopNum);
                jbMtPoList.add(jbMtPo);
            }
        });
        return jbMtPoList;
    }

    @Override
    public List<FireLimitPO> getFireLimit() {
        //获取当前时间的小时和分钟数，分钟取15的倍数如当前时间为10:23，则取10:15
        String time = getNowHH24MI(LocalTime.now(),limitTime);

        String fileName = limitFilePrefix + time + limitFileSuffix;
        String filePath = limitFilePath + fileName;
        File file = new File(filePath);

        log.info("解析文件：{}", filePath);

        //解析excel
        //TIME	STATION_ID	STATION_NAME	GENERATOR_ID	GENERATOR_NAME	UPPER	LOWER
        //18:30	3377981199799550022	冀北.邓新房	3378262674776260835	邓新房1号机	190.0	95.0
        //18:30	3377981199799550025	冀北.陡河	3378262674776260845	陡河7号机	210.0	105.0
        //18:30	3377981199799550025	冀北.陡河	3378262674776260846	陡河8号机	186.0	137.0
        ExcelReader reader = ExcelUtil.getReader(file);
        List<FireLimitPO> all = reader.readAll(FireLimitPO.class);

        return all;
    }

    @Override
    public List<SOCPO> getSOC(String ids) {

        String DATA_ID = "DATA_ID";
        String NAME = "NAME";
        //只取最新的SQL字段
        LocalTime localTime = LocalTime.now().plusMinutes(-1);
        int h = localTime.getHour();
        int m = localTime.getMinute();
        String DATA_ = "DATA_" + h + "_" + m;

        String fields = DATA_ID + "," + NAME + "," + DATA_;
        if (realPost.equals("true")) {
            fields = "*";
        }
        //{
        //	"type":"select",
        //	"sql":"SELECT * FROM HISDB.MANALOG_DATA_SCADA_20250125 WHERE DATA_ID IN ('122723133097588572','122723133097588573','122723133097588574') ",
        //	"resultType":"list"
        //}

        //获取今天的日期20250125
        String day = LocalDate.now().toString().replace("-", "");

        //构建请求参数
        String type = "select";
        String sql = "SELECT " + fields + " FROM HISDB.MANALOG_DATA_SCADA_" + day + " WHERE DATA_ID IN (" + ids + ") ";
        String resultType = "list";

        HashMap<String, String> map = new HashMap<>();
        map.put("type", type);
        map.put("sql", sql);
        map.put("resultType", resultType);

        String body = JSON.toJSONString(map);

        String post = null;

        if (testPost.equals("true")) {
            log.info("测试post请求");
            //[
            //            		{
            //            			"DATA_0_0": 73.73293,
            //            			"DATA_0_1": 73.71056,
            //            			"DATA_0_10": 73.71056,
            //            			"DATA_ID": 122723133097588576,
            //            			"NAME": "冀北.华能果家沟光储电站/储能电站SOC实际值"
            //            		},
            //            		{
            //            			"DATA_0_0": 73.73293,
            //            			"DATA_0_1": 73.71056,
            //            			"DATA_0_10": 73.71056,
            //            			"DATA_ID": 122723133097588577,
            //            			"NAME": "冀北.华能果家沟光储电站/储能电站SOC上下限"
            //            		}
            //            	]
            post = "[\n" +
                    "\t\t\t\t{\n" +
                    "\t\t\t\t\t\"DATA_0_0\": 73.73293,\n" +
                    "\t\t\t\t\t\"DATA_0_1\": 73.71056,\n" +
                    "\t\t\t\t\t\"DATA_0_10\": 73.71056,\n" +
                    "\t\t\t\t\t\"DATA_ID\": 122723133097588576,\n" +
                    "\t\t\t\t\t\"NAME\": \"冀北.华能果家沟光储电站/储能电站SOC实际值\"\n" +
                    "\t\t\t\t},\n" +
                    "\t\t\t\t{\n" +
                    "\t\t\t\t\t\"DATA_0_0\": 73.73293,\n" +
                    "\t\t\t\t\t\"DATA_0_1\": 73.71056,\n" +
                    "\t\t\t\t\t\"DATA_0_10\": 73.71056,\n" +
                    "\t\t\t\t\t\"DATA_ID\": 122723133097588577,\n" +
                    "\t\t\t\t\t\"NAME\": \"冀北.华能果家沟光储电站/储能电站SOC上下限\"\n" +
                    "\t\t\t\t}\n" +
                    "\t\t\t]";

        } else {
            log.info("正式post请求");
            log.info("请求参数：{}", body);
            post = HttpUtil.post(socUrl, body);
        }

        //解析返回结果
        //[
        //		{
        //			"DATA_0_0": 73.73293,
        //			"DATA_0_1": 73.71056,
        //			"DATA_0_10": 73.71056,
        //			"DATA_ID": 122723133097588576,
        //			"NAME": "冀北.华能果家沟光储电站/储能电站SOC实际值"
        //		},
        //		{
        //			"DATA_0_0": 73.73293,
        //			"DATA_0_1": 73.71056,
        //			"DATA_0_10": 73.71056,
        //			"DATA_ID": 122723133097588577,
        //			"NAME": "冀北.华能果家沟光储电站/储能电站SOC上下限"
        //		}
        //	]
        JSONArray array = JSON.parseArray(post);
        //// 业务处理逻辑，返回处理后的结果
        //  var result = [];
        //  for(i=0;i<jsonData.length;i++){
        //    item = jsonData[i];
        //    var dataId = item["DATA_ID"];
        //    var name = item["NAME"];
        //    for (var key in item) {
        //      if (key.startsWith("DATA_") && key !== "DATA_ID") {
        //
        //        var trimmedString = key.replace('DATA_', '');
        //        var parts = trimmedString.split('_');
        //
        //        var newRow = {
        //          DATA_ID: dataId,
        //          NAME: name,
        //          OTHER_KEY: key,
        //          OTHER_HOUR: parts[0],
        //          OTHER_MINUTE: parts[1],
        //          OTHER_VAL: item[key]
        //        };
        //        // 将新的对象添加到结果数组中
        //        result.push(newRow);
        //      }
        //    }
        //  }
        //  return result
        List<SOCPO> socpoList = new ArrayList<>();
        array.forEach(item -> {
            String dataId = ((JSONObject) item).getString("DATA_ID");
            String name = ((JSONObject) item).getString("NAME");
            ((JSONObject) item).forEach((key, value) -> {
                if (key.startsWith("DATA_") && !key.equals("DATA_ID")) {
                    String trimmedString = key.replace("DATA_", "");
                    String[] parts = trimmedString.split("_");

                    SOCPO socpo = new SOCPO();
                    socpo.setDATA_ID(dataId);
                    socpo.setNAME(name);
                    socpo.setOTHER_KEY(key);
                    socpo.setOTHER_DAY(day);
                    socpo.setOTHER_HOUR(parts[0]);
                    socpo.setOTHER_MINUTE(parts[1]);
                    socpo.setOTHER_VAL(value.toString());
                    socpoList.add(socpo);
                }
            });
        });




        return socpoList;
    }

    public static void main(String[] args) {
        String limitTime = "15"; // 你可以改成别的
        for (int hour = 0; hour < 24; hour++) {
            for (int minute = 0; minute < 60; minute += 15) {
                LocalTime now = LocalTime.of(hour, minute);
                String result = getNowHH24MI(now, limitTime);
                System.out.printf("当前时间: %02d:%02d, 结果: %s\n", hour, minute, result);
            }
        }
    }

    private static String getNowHH24MI(LocalTime now, String limitTime) {
        int hour = now.getHour();
        int minute = now.getMinute();
        int mi15 = minute / 15 * 15;

        LocalTime time = LocalTime.of(hour, mi15);
        if (time.getHour() == 0 && time.getMinute() < Integer.parseInt(limitTime)) {
            return "2345";
        } else {
            time = time.minusMinutes(Long.parseLong(limitTime));
        }

        return String.format("%02d%02d", time.getHour(), time.getMinute());
    }

}
